/*
	Copyright (C) 2013 Pontificia Universidad Catolica del Peru
	contact: http://avatar.inf.pucp.edu.pe/realidad-aumentada/
	address contact: Av. Universitaria 1801, San Miguel, Lima-Peru.
	
	This file is part of UbicAR PUCP.

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with This program.  If not, see <http://www.gnu.org/licenses/>.
*/
/*
	Authors: Alvaro Roger Agüero Sánchez, Rodolfo Javier Galvez Meza
	Pontificia Universidad Catolica del Peru
	Departamento de Ingeniería
*/

package org.grupoavatar.guiaubicua.auxiliares;

import java.util.List;

import org.grupoavatar.guiaubicua.R;
import org.grupoavatar.guiaubicua.VInicial;
import org.grupoavatar.guiaubicua.mix.data.Pregunta;
import org.grupoavatar.guiaubicua.punto.EncuestaIntroScreen;
import org.grupoavatar.guiaubicua.punto.EncuestaScreen;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;

public class PreguntasExpandableListAdapter extends BaseExpandableListAdapter {

	private Context mContext;
	private ExpandableListView mExpandableListView;
	private List<PreguntasEntity> preguntas;
	private int[] groupStatus;

	public PreguntasExpandableListAdapter(Context pContext, ExpandableListView pExpandableListView, List<PreguntasEntity> pGroupCollection) {
		mContext = pContext;
		preguntas = pGroupCollection;
		mExpandableListView = pExpandableListView;
		groupStatus = new int[preguntas.size()];

		setListEvent();
	}

	private void setListEvent() {

		mExpandableListView
				.setOnGroupExpandListener(new OnGroupExpandListener() {

					@Override
					public void onGroupExpand(int groupPosition) {
						// TODO Auto-generated method stub
						groupStatus[groupPosition] = 1;
					}
				});

		mExpandableListView
				.setOnGroupCollapseListener(new OnGroupCollapseListener() {

					@Override
					public void onGroupCollapse(int groupPosition) {
						// TODO Auto-generated method stub
						groupStatus[groupPosition] = 0;
					}
				});
	}

	@Override
	public String getChild(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return preguntas.get(groupPosition).listaOpciones.get(childPosition).opcion;
	}

	@Override
	public long getChildId(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild, View convertView,
			ViewGroup parent) {
		// TODO Auto-generated method stub

		ListaOpcionesHolder childHolder;
		
		if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(
					R.layout.pregunta_row, null);

			childHolder = new ListaOpcionesHolder();
			
			//childHolder.pregunta = (TextView) convertView.findViewById(R.id.txtPregunta);
			childHolder.linearLayoutOpciones = (LinearLayout) convertView.findViewById(R.id.conjuntoOpciones);
			//childHolder.opciones = (ListView) convertView.findViewById(R.id.listViewOpciones);
			convertView.setTag(childHolder);
		}else {
			childHolder = (ListaOpcionesHolder) convertView.getTag();
		}

		Pregunta pregunta = EncuestaIntroScreen.getEncuestaActual().getPreguntas().get(groupPosition);
		//childHolder.pregunta.setText(pregunta.getDetalle());
		
		ListaOpcionesRow dataOpc[] = new ListaOpcionesRow[pregunta.getOpciones().size()];
		for (int k = 0; k < pregunta.getOpciones().size(); k++) {
			dataOpc[k] = new ListaOpcionesRow(pregunta.getOpciones().get(k).getId(), pregunta.getOpciones().get(k).getOpcion(), pregunta.getOpciones().get(k).isMarcado(), groupPosition, k);
		}
		
		establecerConjuntoOpciones(childHolder.linearLayoutOpciones,dataOpc);
//		OpcionesListAdapter adapter = new OpcionesListAdapter(mContext,
//				R.layout.opcion_row, dataOpc, groupPosition);
//		childHolder.opciones.setAdapter(adapter);
		
		return convertView;
	}

	@Override
	public int getChildrenCount(int groupPosition) {
		// TODO Auto-generated method stub
		int total = 1;
		//return preguntas.get(groupPosition).listaOpciones.size();
		return total;
	}

	@Override
	public Object getGroup(int groupPosition) {
		// TODO Auto-generated method stub
		return preguntas.get(groupPosition);
	}

	@Override
	public int getGroupCount() {
		// TODO Auto-generated method stub
		return preguntas.size();
	}

	@Override
	public long getGroupId(int groupPosition) {
		// TODO Auto-generated method stub
		return groupPosition;
	}

	@Override
	public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		GroupHolder groupHolder;
		if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(R.layout.pregunta_row_group,
					null);
			groupHolder = new GroupHolder();
			groupHolder.title = (TextView) convertView.findViewById(R.id.txtPregunta);
			convertView.setTag(groupHolder);
		} else {
			groupHolder = (GroupHolder) convertView.getTag();
		}

		groupHolder.title.setText(preguntas.get(groupPosition).pregunta.getDetalle());
		
		return convertView;
	}

	class GroupHolder {
		TextView title;
	}

	class ChildHolder {
		TextView title;
		
	}

	@Override
	public boolean hasStableIds() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public boolean isChildSelectable(int groupPosition, int childPosition) {
		// TODO Auto-generated method stub
		return true;
	}

	public static class ListaOpcionesHolder {
		//public TextView pregunta;
		public ListView opciones;
		public LinearLayout linearLayoutOpciones;
	}
	
	private void establecerConjuntoOpciones(LinearLayout layoutContenedor, final ListaOpcionesRow dataOpc[]) {
		//parametro inflater
		LayoutInflater inflater = (LayoutInflater)VInicial.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		layoutContenedor.removeAllViews();
		//Contenido
		final Pregunta pregunta = EncuestaIntroScreen.getEncuestaActual().getPreguntas().get(dataOpc[0].indicePregunta);
		for (int i = 0; i < dataOpc.length; i++) {
			LinearLayout linText = new LinearLayout(VInicial.getContext());
			final int j = i;
			
			if (pregunta.getTipoPregunta() == Pregunta.UNICA_RESPUESTA) {
				inflater.inflate(R.layout.opcion_radiobutton_row, linText);
				RadioButton rad = (RadioButton) linText.findViewById(R.id.radOpc);
				rad.setChecked(pregunta.getOpciones().get(i).isMarcado());
				rad.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
	//					OpcionPregunta opc = EncuestaIntroScreen.getEncuestaActual().getPreguntas().get(dataOpc[j].indicePregunta).getOpciones().get(dataOpc[j].indiceOpcion);
						
						for (int k = 0; k < pregunta.getOpciones().size(); k++) {
							if (k != dataOpc[j].indiceOpcion)
								pregunta.getOpciones().get(k).desmarcar();
							else
								pregunta.getOpciones().get(k).marcar();
						}
						if (!((EncuestaScreen)mContext).isEnviarButtonEnabled()) {
							if (EncuestaIntroScreen.getEncuestaActual().isValido()) {
								((EncuestaScreen)mContext).enableEnviarButton();
							}
						}
						notifyDataSetChanged();
					}
				});
				String texto = dataOpc[i].opcion;
				rad.setText(texto);
				layoutContenedor.addView(linText);
			} else if (pregunta.getTipoPregunta() == Pregunta.MULTIPLES_RESPUESTAS){
				inflater.inflate(R.layout.opcion_checkbox_row, linText);
				CheckBox cbx = (CheckBox) linText.findViewById(R.id.cbxOpc);
				cbx.setChecked(pregunta.getOpciones().get(i).isMarcado());
				cbx.setOnClickListener(new OnClickListener() {
					
					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
	//					OpcionPregunta opc = EncuestaIntroScreen.getEncuestaActual().getPreguntas().get(dataOpc[j].indicePregunta).getOpciones().get(dataOpc[j].indiceOpcion);
						
						if (pregunta.getOpciones().get(dataOpc[j].indiceOpcion).isMarcado()) {
							pregunta.getOpciones().get(dataOpc[j].indiceOpcion).desmarcar();
						} else {
							pregunta.getOpciones().get(dataOpc[j].indiceOpcion).marcar();
						}
						
						notifyDataSetChanged();
					}
				});
				String texto = dataOpc[i].opcion;
				cbx.setText(texto);
				layoutContenedor.addView(linText);
			}
		}		
	}
}